package jadex.tools.comanalyzer.graph; import java.awt.geom.Point2D; import java.util.ConcurrentModificationException; import java.util.Iterator; import edu.uci.ics.jung.algorithms.layout.Layout; import edu.uci.ics.jung.graph.Graph; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.layout.LayoutTransition; /** * Added ConcurrentModificationException handling in method step() */ public class GraphLayoutTransition extends LayoutTransition { // -------- constructor -------- public GraphLayoutTransition(VisualizationViewer vv, Layout startLayout, Layout endLayout) { super(vv, startLayout, endLayout); } // -------- LayoutTransition methods -------- public void step() { Graph g = transitionLayout.getGraph(); try { for(Iterator it = g.getVertices().iterator(); it.hasNext();) { Object v = it.next(); Point2D tp = (Point2D)transitionLayout.transform(v); Point2D fp = (Point2D)endLayout.transform(v); double dx = (fp.getX() - tp.getX()) / (count - counter); double dy = (fp.getY() - tp.getY()) / (count - counter); transitionLayout.setLocation(v, new Point2D.Double(tp.getX() + dx, tp.getY() + dy)); } } catch(ConcurrentModificationException e) { // vertices could be removed while animator is running // end animator because a new one is triggered anyways // System.err.println("ConcurrentModificationException in step " + // counter); counter = count; } counter++; if(counter >= count) { done = true; vv.setGraphLayout(endLayout); } vv.repaint(); } }